﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Ro.AssistFunction.OutputManage;
using Ro.Common.RoArgs;
using Ro.Common.RoInterface.UserType;

namespace Ro.AssistFunction.BackNodeInfo
{
    /*#############################################################################################
            将含有参数的字符转为正常的字符
            解析时，自右向左进行解析，到达最后一个时，不解析，作为正常文本传值
            *TODO 在Tcc文件中，参数必须是强制值，不能再已任何形式的参数传递
            ######################################################
            *TODO 再Tcs文件中，参数的使用允许被配置成如下形式
             *${参数值}
             *${参数值}/${参数值}
             *${正常值${参数值}}
      #############################################################################################*/


    /// <summary>
    /// 将含有参数的字符转为正常的值返回
    /// </summary>
    public class ArgsIntoValue
    {
        public string BackValue;

        /// <summary>
        /// 临时使用string参数
        /// </summary>
        private readonly StringBuilder _tempStrB;


        /// <summary>
        /// 构造函数
        /// 返回tci的全路径
        /// </summary>
        /// <param name="provalue">需要解析的带参数的文本</param>
        /// <returns>返回全tci路径</returns>
        public ArgsIntoValue(string provalue)
        {
            //初始化StringBuilder
            _tempStrB = new StringBuilder();
            RecurGetValue(provalue); //执行递归函数，将含有参数的值转为普通全值
            string temp = _tempStrB.ToString();

            //如果自身参数存在 /的传入，需要减去一次 /
            if (temp.EndsWith("/"))
            {
                temp = temp.Substring(0, temp.Length - 1);
            }
            if (temp.EndsWith("//"))
            {
                temp = temp.Substring(0, temp.Length - 1);
            }
            //给定返回值
            BackValue = temp;
        }


        /// <summary>
        /// 私有方法，通过递归的方法反馈待解析的文本
        /// </summary>
        /// <param name="provalue">待解析的文本</param>
        private void RecurGetValue(string provalue)
        {
            try
            {
                //如果包含参数的标机值 ${}
                if (provalue.Contains("${") && provalue.Contains("}"))
                {
                    //如果包含 / 分隔符,需要分拆
                    if (provalue.Contains("/"))
                    {
                        string[] tempStrs = provalue.Split('/');
                        foreach (string sigvars in tempStrs)
                        {
                            //递归验证
                            RecurGetValue(sigvars);
                            _tempStrB.Append("/");
                        }
                    }

                    //不包含 “/” 分隔符
                    //自左向用进行正则表达查询
                    else
                    {
                        Regex regex = new Regex("\\$\\{[a-zA-Z0-9_]*\\}", RegexOptions.RightToLeft);
                        string sigstr = regex.Match(provalue).Value;
                        //纯参数ID
                        string proid = sigstr.Replace("${", "").Replace("}", "");
                        //从参数列表中查询
                       PropertyAction.PropertyAction propertyAction = new PropertyAction.PropertyAction();
                        string value = propertyAction.SelectPropertyValue(proid);

                        //如果参数List中存在已存在的值
                        if (value != null)
                        {
                            //然后参数替换
                            provalue = provalue.Replace(sigstr, value);
                            //递归验证
                            RecurGetValue(provalue);
                        }
                    }
                }
                //不含任何参数，纯正常值
                else
                {
                    if (!string.IsNullOrEmpty(provalue))
                    {
                        _tempStrB.Append(provalue);
                    }
                }
            }
            catch (Exception e)
            {
                //添加输出
                ExceptionOutPut.SystemExceptionOut("RecurGetValue", e);
            }
        }
    }


    /// <summary>
    /// 特殊结构的参数转置为正常值返回
    /// </summary>
    public class SpecalArgsIntoValue
    {
        /// <summary>
        /// 通过 “.” 来分离给定的值，基本是迭代测试信息中给定的listitems进行反馈
        /// </summary>
        /// <param name="provalue">
        /// 需要解析的文本
        /// <example>${参数值.参数值}</example>
        /// </param>
        /// <returns></returns>
        public Queue<string> BackUseListArgs(string provalue)
        {
            //取出多余符号
            provalue = provalue.Replace("${", "").Replace("}", "");

            //检查系统存储的list
            ConfLists tempConfLists = (from temp in RoPubArgments.GuiTccInfo.GuiConfLists where temp.ListId == provalue select temp).SingleOrDefault();
            Queue<string> backQueue = tempConfLists?.ListItem;
            return backQueue;
        }


        /// <summary>
        /// 通过 “.” 来分离给定的值，部分方法会使用langs的信息
        /// </summary>
        /// <param name="provalue">
        /// 需要解析的文本
        /// <example>${tcc值.langs值}</example>
        /// </param>
        /// <returns></returns>
        public List<string> BackLangsArgs(string provalue)
        {
            //取出多余符号
            provalue = provalue.Replace("${", "").Replace("}", "");

            string id = provalue.Split('.')[0];
            //检查系统存储的list
            ConfLangs confLangs = (from temp in RoPubArgments.GuiTccInfo.GuiConfLangs where temp.LangId == id select temp).SingleOrDefault();
            return confLangs?.LangValue;
        }
    }
}


